package com.tegtech.tools.wechat.support;

import java.io.ByteArrayInputStream;
import java.io.InputStream;
import java.util.HashMap;
import java.util.Map;

import org.springframework.http.HttpMethod;

import com.google.common.collect.Maps;
import com.tegtech.tools.wechat.domain.LoginResult;
import com.tegtech.tools.wechat.domain.ResultCode;
import com.tegtech.tools.wechat.domain.TokenResult;
import com.tegtech.tools.wechat.enums.WeChatUrl;
import com.tegtech.tools.wechat.properties.WechatProperties;
import com.tegtech.tools.wechat.util.RestTemplateUtil;

/**
 * 微信小程序服务处理类
 *
 * @author Jun
 * @date 2019年1月4日 下午1:43:49
 */
public class WeChatSupport {

	/**
	 * 请求微信后台获取用户数据
	 * @param code	wx.login获取到的临时code
	 * @return
	 */
	public static LoginResult jscode2session(String code) {
		String url = WeChatUrl.CODE_TO_SESSION_URL.init(WechatProperties.getAppId(), WechatProperties.getAppSecret(), code);
		return RestTemplateUtil.send(url, HttpMethod.GET, null, null, LoginResult.class);
	}

	/**
	 * 获取小程序全局唯一后台接口调用凭据access_token
	 *
	 * @return
	 */
	public static TokenResult getAccessToken() {
		String url = WeChatUrl.ACCESS_TOKEN_URL.init(WechatProperties.getAppId(), WechatProperties.getAppSecret());
		return RestTemplateUtil.send(url, HttpMethod.GET, null, null, TokenResult.class);
	}

	/**
	 * 发送订阅消息
	 * @param accessToken	接口调用凭证
	 * @param touser		接收者（用户）的 openid
	 * @param templateId	所需下发的订阅模板id
	 * @param page			点击模板卡片后的跳转页面，仅限本小程序内的页面。支持带参数,（示例index?foo=bar）。该字段不填则模板无跳转。
	 * @param data			模板内容
	 * @return
	 */
	public static ResultCode subscribeMessageSend(String accessToken, String touser, String templateId, String page, Map<String, Object> data) {
		String url = WeChatUrl.SUBSCRIBE_SEND_URL.init(accessToken);
		Map<String, Object> params = Maps.newHashMapWithExpectedSize(6);
		params.put("touser", touser);				// 接收者（用户）的 openid
		params.put("template_id", templateId);		// 所需下发的订阅模板id
		params.put("page", page);					// 点击模板卡片后的跳转页面，仅限本小程序内的页面。支持带参数,（示例index?foo=bar）。该字段不填则模板无跳转。
		params.put("miniprogram_state", "formal");	// 跳转小程序类型：developer为开发版；trial为体验版；formal为正式版；默认为正式版
		params.put("lang", "zh_CN");				// 进入小程序查看”的语言类型，支持zh_CN(简体中文)、en_US(英文)、zh_HK(繁体中文)、zh_TW(繁体中文)，默认为zh_CN
		params.put("data", data);					// 模板内容
		return RestTemplateUtil.send(url, HttpMethod.POST, params, null, ResultCode.class);
	}
	
	/**
	 * 生成带参数的小程序二维码
	 *
	 * @param token
	 * @param param
	 * @param page
	 * @param isHyaline 是否需要透明底色，为 true 时，生成透明底色的小程序
	 * @return
	 */
	public static InputStream getWXCodeUnlimit(String token, String param, String page, boolean isHyaline) {
		Map<String, Object> params = new HashMap<>();
		params.put("scene", param); // 自定义参数
		params.put("is_hyaline", isHyaline);
		params.put("page", page);
		String url = WeChatUrl.QR_CODE_URL.init(token);
		byte[] result = RestTemplateUtil.send(url, HttpMethod.POST, params, null, byte[].class);
		InputStream inputStream = new ByteArrayInputStream(result);
		return inputStream;
	}
	
}
